<> AdVanCeD arT oF CrAcKiNg GrOuP <>

PResents ____Tutorial____________________AAOCG^

HOW TO CRACK: Knights & Merchants PL


		bY :> Chendler
	
Tools:
- shit 98 / 95
- SI4.0
- W32dsm
- Mozq
- HiEW
- Troszke ZeN CraCKiNG

WStEp:

Witam w kolejnym mam nadzieje nie nudnym tutorze
na temat cd-checka. Ach te tutory juz 14 z kolei.
Wszystkie tuty mozesz znalezc na oficjalnej 
stronie grupy AAOCG ( www.aaocg.prv.pl ).
Sprzyda ci sie troszke filozofii zen cracking
jezeli nie wiesz co to jest to przeczytaj
tutory przedniej jakosci by lukep.
Dobra gierka ma calkiem latwe zabezpieczenie
wiec jesli sam nie rozwaliles jej do czytaj dalej.

LeT's gO To TrAns.....................!

Uruchom gre bez plytki w napedzie. Co widzisz?
Stacja dyskietek zadzialala i wyskoczylo ci
okno dialogowe z napisem zebys wlozyl cd.
Dobra teraz nasz zen cracking. Obejrzyj plytke z gra.
Hej co robisz? obejrzyj jej dane a nie szate graficzna?
Co widzisz? Hmm tylko dwa glupie pliki w katalogu
\km. Hmm jak myslisz czy one sa potrzebne do gry?
No tak masz racje do instalacji tak ale gra z nich
nie korzysta w pelni. Dlaczego nie w pelni? Otoz
Wymagane sa tylko przy sprawdzaniu CD-ROMU. To jak?
Dobra zabierzmy sie za rozwalke.
W32dasm i disam plik ktory ci sie podoba:
mianowicie chodzi tu o :
- kam_1024.exe
- kam_800.exe

Dlaczego pozwolilem ci wybrac dowolny?
Jestem az taki dobroduszny? (to pytanie retoryczne)
Otoz one niczym sie nie roznia od siebie poza tym,
ze jeden wywoluje tryb graficzny w rodzielczosci
1024^768 a drugi 800^600
offsety pozostaja bez zmian.
masz zdisamblerowany plik? no i co?
SDR i %sKM\_setup1.
ok masz? co widzisz?

:0040374C 55                      push ebp
:0040374D 8BEC                    mov ebp, esp
:0040374F 81EC58030000            sub esp, 00000358
:00403755 57                      push edi
:00403756 898DA8FCFFFF            mov dword ptr [ebp+FFFFFCA8], ecx
:0040375C A138B64800              mov eax, dword ptr [0048B638]
:00403761 8985ACFCFFFF            mov dword ptr [ebp+FFFFFCAC], eax
:00403767 33C9                    xor ecx, ecx
:00403769 898DB0FCFFFF            mov dword ptr [ebp+FFFFFCB0], ecx
:0040376F 898DB4FCFFFF            mov dword ptr [ebp+FFFFFCB4], ecx
:00403775 888DB8FCFFFF            mov byte ptr [ebp+FFFFFCB8], cl
:0040377B 8B153CB64800            mov edx, dword ptr [0048B63C]
:00403781 8995D4FEFFFF            mov dword ptr [ebp+FFFFFED4], edx
:00403787 B94A000000              mov ecx, 0000004A
:0040378C 33C0                    xor eax, eax
:0040378E 8DBDD8FEFFFF            lea edi, dword ptr [ebp+FFFFFED8]
:00403794 F3                      repz
:00403795 AB                      stosd
:00403796 C785C0FCFFFFFFFFFFFF    mov dword ptr [ebp+FFFFFCC0], FFFFFFFF
:004037A0 8D8DD4FEFFFF            lea ecx, dword ptr [ebp+FFFFFED4]
:004037A6 E850020000              call 004039FB
:004037AB 85C0                    test eax, eax
:004037AD 7470                    je 0040381F
:004037AF 66C7858CFDFFFF0000      mov word ptr [ebp+FFFFFD8C], 0000
:004037B8 EB12                    jmp 004037CC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403809(U)
|
:004037BA 668B858CFDFFFF          mov ax, word ptr [ebp+FFFFFD8C]
:004037C1 66050100                add ax, 0001
:004037C5 6689858CFDFFFF          mov word ptr [ebp+FFFFFD8C], ax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004037B8(U)
|
:004037CC 8B8D8CFDFFFF            mov ecx, dword ptr [ebp+FFFFFD8C]
:004037D2 81E1FFFF0000            and ecx, 0000FFFF
:004037D8 83F90C                  cmp ecx, 0000000C
:004037DB 7D2E                    jge 0040380B
:004037DD 8B958CFDFFFF            mov edx, dword ptr [ebp+FFFFFD8C]
:004037E3 81E2FFFF0000            and edx, 0000FFFF
:004037E9 33C0                    xor eax, eax
:004037EB 8A82B8904800            mov al, byte ptr [edx+004890B8]
:004037F1 35EF000000              xor eax, 000000EF
:004037F6 8B8D8CFDFFFF            mov ecx, dword ptr [ebp+FFFFFD8C]
:004037FC 81E1FFFF0000            and ecx, 0000FFFF
:00403802 88840DACFCFFFF          mov byte ptr [ebp+ecx-00000354], al
:00403809 EBAF                    jmp 004037BA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004037DB(C)
|
:0040380B 8B958CFDFFFF            mov edx, dword ptr [ebp+FFFFFD8C]
:00403811 81E2FFFF0000            and edx, 0000FFFF
:00403817 C68415ACFCFFFF00        mov byte ptr [ebp+edx-00000354], 00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004037AD(C)
|
:0040381F 8D85D4FEFFFF            lea eax, dword ptr [ebp+FFFFFED4]
:00403825 50                      push eax

* Possible StringData Ref from Data Obj ->"%sKM\_setup.1" <: dobra jest
                                  |
:00403826 6840B64800              push 0048B640
:0040382B 8D8DC4FCFFFF            lea ecx, dword ptr [ebp+FFFFFCC4]
:00403831 51                      push ecx

* Reference To: USER32.wsprintfA, Ord:0264h
                                  |
:00403832 FF154CE55000            Call dword ptr [0050E54C]
:00403838 83C40C                  add esp, 0000000C
:0040383B 8D9594FDFFFF            lea edx, dword ptr [ebp+FFFFFD94]
:00403841 52                      push edx
:00403842 8D85C4FCFFFF            lea eax, dword ptr [ebp+FFFFFCC4]
:00403848 50                      push eax

* Reference To: KERNEL32.FindFirstFileA, Ord:0082h
                                  |
:00403849 FF15BCE35000            Call dword ptr [0050E3BC]
:0040384F 8985BCFCFFFF            mov dword ptr [ebp+FFFFFCBC], eax
:00403855 83BDBCFCFFFFFF          cmp dword ptr [ebp+FFFFFCBC], FFFFFFFF
:0040385C 7419                    je 00403877
:0040385E 8B8DB4FDFFFF            mov ecx, dword ptr [ebp+FFFFFDB4]
:00403864 898DC0FCFFFF            mov dword ptr [ebp+FFFFFCC0], ecx
:0040386A 8B95BCFCFFFF            mov edx, dword ptr [ebp+FFFFFCBC]
:00403870 52                      push edx

* Reference To: KERNEL32.FindClose, Ord:007Eh
                                  |
:00403871 FF15C8E35000            Call dword ptr [0050E3C8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040385C(C)
|
:00403877 8D85ACFCFFFF            lea eax, dword ptr [ebp+FFFFFCAC]
:0040387D 50                      push eax
:0040387E 8D8DD4FEFFFF            lea ecx, dword ptr [ebp+FFFFFED4]
:00403884 51                      push ecx
:00403885 E826B60600              call 0046EEB0
:0040388A 83C408                  add esp, 00000008
:0040388D 8D9594FDFFFF            lea edx, dword ptr [ebp+FFFFFD94]
:00403893 52                      push edx
:00403894 8D85D4FEFFFF            lea eax, dword ptr [ebp+FFFFFED4]
:0040389A 50                      push eax

* Reference To: KERNEL32.FindFirstFileA, Ord:0082h
                                  |
:0040389B FF15BCE35000            Call dword ptr [0050E3BC]
:004038A1 8985BCFCFFFF            mov dword ptr [ebp+FFFFFCBC], eax
:004038A7 83BDBCFCFFFFFF          cmp dword ptr [ebp+FFFFFCBC], FFFFFFFF
:004038AE 7440                    je 004038F0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004038E1(C)
|
:004038B0 83BDC0FCFFFFFF          cmp dword ptr [ebp+FFFFFCC0], FFFFFFFF
:004038B7 7312                    jnb 004038CB
:004038B9 8B8DC0FCFFFF            mov ecx, dword ptr [ebp+FFFFFCC0]
:004038BF 038DB4FDFFFF            add ecx, dword ptr [ebp+FFFFFDB4]
:004038C5 898DC0FCFFFF            mov dword ptr [ebp+FFFFFCC0], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004038B7(C)
|
:004038CB 8D9594FDFFFF            lea edx, dword ptr [ebp+FFFFFD94]
:004038D1 52                      push edx
:004038D2 8B85BCFCFFFF            mov eax, dword ptr [ebp+FFFFFCBC]
:004038D8 50                      push eax

* Reference To: KERNEL32.FindNextFileA, Ord:0087h
                                  |
:004038D9 FF15CCE35000            Call dword ptr [0050E3CC]
:004038DF 85C0                    test eax, eax
:004038E1 75CD                    jne 004038B0
:004038E3 8B8DBCFCFFFF            mov ecx, dword ptr [ebp+FFFFFCBC]
:004038E9 51                      push ecx

* Reference To: KERNEL32.FindClose, Ord:007Eh
                                  |
:004038EA FF15C8E35000            Call dword ptr [0050E3C8]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004038AE(C)
|
:004038F0 81BDC0FCFFFFF0AA510E    cmp dword ptr [ebp+FFFFFCC0], 0E51AAF0
:004038FA 7515                    jne 00403911
:004038FC 8B95A8FCFFFF            mov edx, dword ptr [ebp+FFFFFCA8]
:00403902 8B02                    mov eax, dword ptr [edx]
:00403904 35032210F0              xor eax, F0102203
:00403909 8B8DA8FCFFFF            mov ecx, dword ptr [ebp+FFFFFCA8]
:0040390F 8901                    mov dword ptr [ecx], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004038FA(C)
|
:00403911 8B15C8904800            mov edx, dword ptr [004890C8]
:00403917 81F2F8F8F8F8            xor edx, F8F8F8F8
:0040391D 899590FDFFFF            mov dword ptr [ebp+FFFFFD90], edx
:00403923 8B85C0FCFFFF            mov eax, dword ptr [ebp+FFFFFCC0]
:00403929 3B8590FDFFFF            cmp eax, dword ptr [ebp+FFFFFD90]
:0040392F 7622                    jbe 00403953
:00403931 81BDC0FCFFFF000000F0    cmp dword ptr [ebp+FFFFFCC0], F0000000
:0040393B 7316                    jnb 00403953
:0040393D 8B8DA8FCFFFF            mov ecx, dword ptr [ebp+FFFFFCA8]
:00403943 8B11                    mov edx, dword ptr [ecx]
:00403945 81F200020000            xor edx, 00000200
:0040394B 8B85A8FCFFFF            mov eax, dword ptr [ebp+FFFFFCA8]
:00403951 8910                    mov dword ptr [eax], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040392F(C), :0040393B(C)
|
:00403953 5F                      pop edi
:00403954 8BE5                    mov esp, ebp
:00403956 5D                      pop ebp
:00403957 C3                      ret

Zobacz zaczyna sie od
push ebp
a konczy sie na ret
Zapewne domyslasz sie juz ze to funkcja. Fajnie wiemy ze jest to
funkcja sprawdzania pliku my jej nie chcemy wiec co robimy?
Zobacz adres przy push ebp:
0040374C
poszukaj go w gore i masz:

:0040120A E83D250000              call 0040374C
:0040120F E8332A0000              call 00403C47
:00401214 85C0                    test eax, eax
:00401216 740A                    je 00401222

ten pierwszy call jest wlasnie ta funkcja. Wiec co masz zrobic?
zrobimy tak zeby on nie byla uruchamiana. Nie bedziemy jej
nopowac gdyz chcemy byc dobrymi crackerami zrobimy trick taki
ze wejdziemy w nia jeszcze raz i zamiast push ebp damy ret
czyli C3.

Spox zobacz co jest dalej: nastepny call wejdz w niego
i zrob to samo z poprzednim. Fajnie teraz mamy
test eax,eax
je ....
na
test eax,eax
jmp ....
wyjdz z tego wszystkiego i zobacz efekt.
Co mamy? Ominelismy sprawdzanie pliku i nie
pojawia sie okno dialogowe. Dobra zmieniles na jmp
ale gdzie on skacze? dobra teraz zobacz:

:0040122C 3B0538D44900            cmp eax, dword ptr [0049D438]
:00401232 740A                    je 0040123E

ha znowu skok zmien na jmp
po zmienieniu gierka pojdzie ale zaraz sie wylaczy gdyz
nie znajdzie pewnego pliku.

:00401232 740A                    je 0040123E idzie do:

:0040123E E8D5040000              call 00401718
:00401243 85C0                    test eax, eax
:00401245 750A                    jne 00401251

tego nie ruszaj podobnie jak tego na dole
dojdz do :

cmp eax,dword ptr [004890CC]
je 00401283

i znow zmien na jmp.
Dobra teraz ten plik. Jak wiadomo podczas startu
gry powinien byc odgrywany plik avi. Czyli
mianowicie publish.avi
dojdziesz do kodu:

:00403F7E E878FAFFFF              call 004039FB
:00403F83 85C0                    test eax, eax
:00403F85 7507                    jne 00403F8E <: no znowu ten skok
:00403F87 33C0                    xor eax, eax
:00403F89 E957030000              jmp 004042E5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403F85(C)
|
:00403F8E 8B0D54D44900            mov ecx, dword ptr [0049D454]
:00403F94 E8AAFB0100              call 00423B43
:00403F99 68F8244500              push 004524F8
:00403F9E 8B0D4CD44900            mov ecx, dword ptr [0049D44C]
:00403FA4 E86F110000              call 00405118
:00403FA9 8D85B4FEFFFF            lea eax, dword ptr [ebp+FFFFFEB4]
:00403FAF 50                      push eax

* Possible StringData Ref from Data Obj ->"%sVideo\publish.avi"
                                  |
:00403FB0 6894B64800              push 0048B694
:00403FB5 8D8DC8FEFFFF            lea ecx, dword ptr [ebp+FFFFFEC8]
:00403FBB 51                      push ecx

* Reference To: USER32.wsprintfA, Ord:0264h
                                  |
:00403FBC FF154CE55000            Call dword ptr [0050E54C]
:00403FC2 83C40C                  add esp, 0000000C
:00403FC5 8B1558D44900            mov edx, dword ptr [0049D458]
:00403FCB 8B02                    mov eax, dword ptr [edx]

Dobra teraz gierka sie uruchomi gdy to wszystko pozmieniasz.
Na zadanie domowe masz:
- dokonac tego jeszcze raz ale samemu
- zmienic exek tak aby nie zaleznie
  od sytuacji moglbys wygrac :)

Pamietaj praktyka czyni mistrza.

Chendler
chen@kki.net.pl

<> AdVanCeD arT oF CrAcKiNg GrOuP <>